﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Models;

namespace DAL
{
    public class ManagementSystem
    {
        //记录工件的个数
        public int m_EmpNum;
        //保存所有工件的信息
        public Prodect[] m_EmpArray;
        //判断文件内存是否为空的标志
        bool m_FileEmpty;
        //文件的路径
        string FileName = "./empFile.txt";

        public ManagementSystem() 
        {
            //1.判断文件是否存在
            if (File.Exists(FileName))
            {
                //2.判断文件当中的内容是否为空
                FileInfo f = new FileInfo(FileName);
                if (f.Length > 0)
                {
                    //文件中存在内容:获取有多少行作为数组的长度
                    this.m_EmpNum = this.Get_EmpNum();
                    Console.WriteLine("工件数量为:{0}",this.m_EmpNum);
                    this.m_EmpArray = new Prodect[this.m_EmpNum];
                    //对数组进行赋值
                    Init_Emp();
                }
                else
                {
                    //文件中没有内容
                    Console.WriteLine("文件内容为空,没有保存数据");
                    this.m_EmpNum = 0;//初始人数
                    this.m_FileEmpty = true;//初始化文件内容为空
                    this.m_EmpArray = null;//初始化数组内容为空
                }
            }
            else
            {
                //文件中没有内容,初始化字段
                Console.WriteLine("文件不存在");
                this.m_EmpNum = 0;//初始人数
                this.m_FileEmpty = true;//初始化文件内容为空
                this.m_EmpArray = null;//初始化数组内容为空
            }
        }
        /// <summary>
        /// 返回txt文本的行数:方便确定数组长度
        /// </summary>
        /// <returns></returns>
        private int Get_EmpNum()
        {
            int lines = 0;
            //创建文件流
            using (FileStream fs= new FileStream(FileName,FileMode.Open))
            {
                //创建读取器
                using (StreamReader sr= new StreamReader(fs))
                {
                    while (sr.ReadLine() != null) { lines++; }
                }
            }
            return lines;
        }
        /// <summary>
        /// 初始化产品数组
        /// </summary>
        private void Init_Emp()
        {
            //创建文件流
            using (FileStream fs= new FileStream(FileName,FileMode.Open))
            {
                //创建读取器
                using (StreamReader sr= new StreamReader(fs))
                {
                    //从头读到尾
                    //字符串的处理有两种方式:1.字符串处理函数 2.正则表达式
                    string[] sArray = Regex.Split(sr.ReadToEnd(), @"\r\n", RegexOptions.IgnoreCase);
                    
                    for (int i = 0; i < sArray.Length; i++)
                    {
                        //分割每一行的内容
                        string[] Prodect_Info = sArray[i].Split('|');
                        if (Prodect_Info.Length>1)
                        {
                            //根据每一行的内容来创建不同的对象
                            Prodect product = null;
                            if (Prodect_Info[3] == "1")//相机
                            {
                                product = new Camera(int.Parse(Prodect_Info[0]), Prodect_Info[1], bool.Parse(Prodect_Info[2]), int.Parse(Prodect_Info[3]));
                            }
                            else if (Prodect_Info[3] == "2")//电池
                            {
                                product = new Battery(int.Parse(Prodect_Info[0]), Prodect_Info[1], bool.Parse(Prodect_Info[2]), int.Parse(Prodect_Info[3]));
                            }
                            else//屏幕
                            {
                                product = new Screen(int.Parse(Prodect_Info[0]), Prodect_Info[1], bool.Parse(Prodect_Info[2]), int.Parse(Prodect_Info[3]));
                            }
                            //对数组进行赋值
                            this.m_EmpArray[i] = product;
                        }

                    }
                }
            }
        }

        /// <summary>
        /// 显示菜单
        /// </summary>
        public void Show_Menu()
        {
            Console.WriteLine("*************************************************************");
            Console.WriteLine("*************************欢迎使用工厂仓库管理系统**************");
            Console.WriteLine("*************************0.退出管理程序***********************");
            Console.WriteLine("*************************1.添加工件信息***********************");
            Console.WriteLine("*************************2.显示工件信息***********************");
            Console.WriteLine("*************************3.删除工件信息***********************");
            Console.WriteLine("*************************4.修改工件信息***********************");
            Console.WriteLine("*************************5.查找工件信息***********************");
            Console.WriteLine("*************************6.清空所有文档***********************");
            Console.WriteLine("*************************7.清空显示菜单***********************");
            Console.WriteLine("*************************************************************");
        }

        /// <summary>
        /// 退出系统
        /// </summary>
        public void Exit_System()
        {
            Console.WriteLine("欢迎下次使用");
            Environment.Exit(0);//执行退出exe程序
        }

        /// <summary>
        /// 添加工件
        /// </summary>
        public void Add_Emp()
        {
            Console.WriteLine("请输入添加工件的数量:");
            //初始化要新增的恩叔
            int addNum = Convert.ToInt32(Console.ReadLine());
            //判断人数
            if (addNum>0)
            {
                //新增的数组长度
                int newSize = this.m_EmpNum + addNum;

                //开辟新的内存空间
                Prodect[] newSpace = new Prodect[newSize];

                //将原有的控件内容先放到新开辟的空间当中
                if (this.m_EmpArray!=null)
                {
                    for (int i = 0; i < m_EmpArray.Length; i++)
                    {
                        newSpace[i] = this.m_EmpArray[i];
                    }
                }

                //提示用户输入新的内容
                for (int i = 0; i < addNum; i++)
                {
                    int id;//ID
                    string name;//名称
                    bool isOK;//是否合格
                    int deptih;//出自的流水线

                    Console.WriteLine("请输入第{0}个工件编号:", i + 1);
                    id = Convert.ToInt32(Console.ReadLine());

                    Console.WriteLine("请输入第{0}个工件名称:", i + 1);
                    name = Console.ReadLine();

                    Console.WriteLine("请输入第{0}个工件是否合格(True/False):", i + 1);
                    isOK = bool.Parse(Console.ReadLine());

                    Console.WriteLine("请输入第{0}个工件出产的流水线编号(1.相机|2.电池|3.屏幕):", i + 1);
                    deptih = Convert.ToInt32(Console.ReadLine());

                    Prodect prodect = null;

                    switch (deptih)
                    {
                        case 1://相机
                            prodect = new Camera(id, name, isOK, deptih);
                            break;
                        case 2://电池
                            prodect = new Battery(id, name, isOK, deptih);
                            break;
                        case 3://屏幕
                            prodect = new Screen(id, name, isOK, deptih);
                            break;
                        default:
                            break;
                    }
                    //对新增的数组内容赋值
                    newSpace[this.m_EmpNum + i] = prodect;
                }

                //释放原有的内容
                this.m_EmpArray = null;

                //更新原有数组的内容
                this.m_EmpArray = newSpace;

                //更新个数
                this.m_EmpNum = newSize;

                //提示用户已经更新完成
                Console.WriteLine("成功添加:{0} 个工件!", addNum);

                //保存数组到txt当中
                this.Save();
            }
        }
        /// <summary>
        /// 保存产品数组数据到txt当中
        /// </summary>
        private void Save()
        {
            //创建文件流读取器
            using (FileStream fs = new FileStream(FileName,FileMode.Create))
            {
                //创建写入器
                using (StreamWriter sw= new StreamWriter(fs))
                {
                    for (int i = 0; i < this.m_EmpNum; i++)
                    {
                        string str = m_EmpArray[i].m_ID.ToString()
                                            + "|" + m_EmpArray[i].m_name 
                                            + "|" + m_EmpArray[i].m_IsOK.ToString()
                                            + "|" + m_EmpArray[i].m_Deptid.ToString();
                        sw.WriteLine(str);
                    }
                }
            }
        }

        /// <summary>
        /// 显示零件
        /// </summary>
        public void Show_Emp()
        {
            //判断文件不操作或者为空
            if (this.m_FileEmpty)
            {
                Console.WriteLine("文件不存在记录为空!");
            }
            else
            {
                for (int i = 0; i < this.m_EmpNum; i++)
                {
                    m_EmpArray[i].showInfo();
                }
            }
        }

        /// <summary>
        /// 删除工件
        /// </summary>
        public void Del_Emp()
        {
            if (File.Exists(FileName) == false)
            {
                Console.WriteLine("文件不存在或记录为空");
            }
            else
            {
                Console.WriteLine("请输入要删除的工件编号:");
                //输入查找是否存在对应的编号，如果没有返回-1，如果存在返回对应的编号
                int index = this.IsExist(int.Parse(Console.ReadLine()));
                //判断如果为-1说明编号不在其数组当中，要求客户确认编号
                if (index!=-1)
                {
                    //数据往前挪，覆盖原有的数据
                    for (int i = index; i < this.m_EmpNum-1; i++)
                    {
                        //遍历到选中的索引值->数据向前移动
                        this.m_EmpArray[i] = m_EmpArray[i + 1];
                    }
                    //跟新记录的工件个数
                    this.m_EmpNum--;
                    //同步到更新的文件当中
                    this.Save();
                    //提示用户删除成功
                    Console.WriteLine("删除成功");
                }
                else
                {
                    Console.WriteLine("尚未找到对应编号,请检查ID");
                }
            }
        }
        /// <summary>
        /// 查找输入的编号是否存在，如果存在返回对应的编号
        /// </summary>
        /// <param name="ID">要查找的ID编号</param>
        /// <returns>返回对应数组的索引位置</returns>
        private int IsExist(int ID)
        {
            int index = -1;
            for (int i = 0; i < this.m_EmpNum; i++)
            {
                if (this.m_EmpArray[i].m_ID==ID)
                {
                    index = i;
                    break;
                }
            }
            return index;
        }

        /// <summary>
        /// 修改工件信息
        /// </summary>
        public void Mod_Emp()
        {
            if (this.m_FileEmpty)
            {
                Console.WriteLine("文件不存在或为空");
            }
            else
            {
                Console.WriteLine("请输入修改工件的编号");
                //提示输入并查找编号，如果没有返回-1，如果存在返回对应的编号
                int index = this.IsExist(int.Parse(Console.ReadLine()));
                if (index != -1)
                {
                    //输入之前清空定位到的单元内容
                    this.m_EmpArray[index] = null;

                    //提示输入工件新的编号
                    Console.WriteLine("请输入工件的新编号");
                    int newid = int.Parse(Console.ReadLine());

                    //输入零件名称
                    Console.WriteLine("请输入工件的新名称");
                    string newName = Console.ReadLine();

                    //零件是否合格
                    Console.WriteLine("工件是否合格(True/False)");
                    bool IsOK;
                    while (true)
                    {
                        if (bool.TryParse(Console.ReadLine(), out IsOK))
                        {
                            break;
                        }
                        else
                        {
                            Console.WriteLine("输入格式不正确,请输入:(True/False)");
                        }
                    }

                    //请输入流水线的编号
                    Console.WriteLine("请输入工件所属的流水线编号");
                    Console.WriteLine("1.相机");
                    Console.WriteLine("2.电池");
                    Console.WriteLine("3.屏幕");

                    //获取所选择的编号
                    int dSelect = int.Parse(Console.ReadLine());

                    //根据输入的数据产生新的对象
                    Prodect prodect = null;
                    //判断所属类别
                    switch (dSelect)
                    {
                        case 1:
                            prodect = new Camera(newid, newName, IsOK, dSelect);
                            break;
                        case 2:
                            prodect = new Battery(newid, newName, IsOK, dSelect);
                            break;
                        case 3:
                            prodect = new Screen(newid, newName, IsOK, dSelect);
                            break;
                        default:
                            break;
                    }
                    //修改数组当中的内容
                    this.m_EmpArray[index] = prodect;
                    //显示修改成功
                    Console.WriteLine("工件编号:{0} 修改成功！", this.m_EmpArray[index].m_ID);
                    //保存修改的内容
                    this.Save();

                }
                else
                {
                    Console.WriteLine("修改失败:查无此工件");
                }

            }
        }

        /// <summary>
        /// 查找工件信息
        /// </summary>
        public void Find_Emp()
        {
            //文件是否为空
            if (this.m_FileEmpty)
            {
                Console.WriteLine("文件不存在或记录为空");
            }
            else
            {
                Console.WriteLine("请输入查找的方式:");
                Console.WriteLine("1.按工件编号查找");
                Console.WriteLine("2.按流水线编号查找");

                string select = Console.ReadLine();

                if (select == "1")//按照工号查找
                {
                    Console.WriteLine("请输入要查找的工件编号");
                    int ret = this.IsExist(int.Parse(Console.ReadLine()));
                    if (ret != -1)
                    {
                        Console.WriteLine("查找成功!该工件消息如下");
                        this.m_EmpArray[ret].showInfo();
                    }
                    else
                    {
                        Console.WriteLine("查找失败,没有此工件");
                    }

                }
                else if (select == "2")//按照流水线编号查找
                {
                    Console.WriteLine("请输入查找的流水线编号:(1.相机|2.电池|3.屏幕)");
                    int Deptid = Convert.ToInt32(Console.ReadLine());
                    for (int i = 0; i < this.m_EmpNum; i++)
                    {
                        if (m_EmpArray[i].m_Deptid==Deptid)
                        {
                            m_EmpArray[i].showInfo();
                        }
                    }
                }
                else
                {
                    Console.WriteLine("请按规范输入查找方式");
                }


            }

        }

        /// <summary>
        /// 清除所有工件信息: 删除储存信息的文件
        /// </summary>
        public void Clean_File()
        {
            Console.WriteLine("清空确认!");
            Console.WriteLine("1. 确认");
            Console.WriteLine("2. 返回");
            if (Console.ReadLine() == "1")
            {
                //判断文件是否存在,如果存在就清空
                if (File.Exists(this.FileName))
                {
                    //创建文件流
                    using (FileStream fs = new FileStream(FileName,FileMode.Create))
                    {
                        //创建写入器
                        using (StreamWriter sw= new StreamWriter(fs))
                        {
                            sw.Write("");//输入空
                        }
                    }
                }
                else
                {
                    Console.WriteLine("文件不存在");
                }
                //执行完上一步的情况下，检查数组是否情况完成
                if (this.m_EmpArray!=null)
                {
                    //设置为空
                    this.m_EmpArray = null;
                    //初始化数量
                    this.m_EmpNum = 0;
                    //设置文件状态
                    this.m_FileEmpty = true;
                }
                //提示清空成功
                Console.WriteLine("清空成功！");
            }
            else
            {
                Console.WriteLine("返回");
            }

        }

    }
}
